1 Cas d’étude

1.1 Jeu de données elec_austr

Le jeu de données elec_austr (source : http://robjhyndman.com/mwh3/data/elec.csv) contient 476 observations (mensuelles, de janvier 1956 à août 1995) de la consommation électrique en Australie (en TWh).

1.2 Jeu de données elec_fr

Le jeu de données elec_fr (source : https://www.rte-france.com/eco2mix/la-consommation-delectricite-en-france) contient 17 568 observations (demi-horaires, du 01/01/2020 à 0h au 31/12/2020 à 23:30) des 4 variables suivantes :

  • date : date (au format jj/mm/aaaa)
  • hm : heure et minutes au format hh:mm
  • conso : consommation électrique (en MW)
  • prev : prévision effectuée la veille (en MW)

2 Importation des données

2.1 Jeu de données elec_austr

elec_austr <- read.table(file="elec_austr.csv",
                         header=FALSE,
                         col.names="conso",
                         comment.char=",")
str(elec_austr)
## 'data.frame':    476 obs. of  1 variable:
##  $ conso: int  1254 1290 1379 1346 1535 1555 1655 1651 1500 1538 ...
head(elec_austr)
##   conso
## 1  1254
## 2  1290
## 3  1379
## 4  1346
## 5  1535
## 6  1555

On lisse la série à l’aide de la moyenne mobile \(M_{(2\times)12}\) : \[M_{(2\times)12}X_t=\frac{1}{12}\left(\frac{1}{2}X_{t-6}+X_{t-5}+X_{t-4}+X_{t-3}+X_{t-2}+X_{t-1}+X_t+X_{t+1}+X_{t+2}+X_{t+3}+X_{t+4}+X_{t+5}+\frac{1}{2}X_{t+6}\right)\ .\] On utilise pour cela la commande filter :

elec_austr$tend <- filter(elec_austr$conso, c(0.5,rep(1, 11),0.5)/12)

2.2 Jeu de données elec_fr

elec_fr <- read.table(file="elec_fr.csv", 
                      header=TRUE, 
                      sep=";")
str(elec_fr)
## 'data.frame':    17568 obs. of  4 variables:
##  $ date : chr  "01/01/2020" "01/01/2020" "01/01/2020" "01/01/2020" ...
##  $ hm   : chr  "00:00" "00:30" "01:00" "01:30" ...
##  $ conso: int  67068 66103 63943 63904 63408 62711 60825 59332 58004 57125 ...
##  $ prev : int  68000 66600 64900 65500 65400 64000 62000 60500 59100 58200 ...
head(elec_fr)
##         date    hm conso  prev
## 1 01/01/2020 00:00 67068 68000
## 2 01/01/2020 00:30 66103 66600
## 3 01/01/2020 01:00 63943 64900
## 4 01/01/2020 01:30 63904 65500
## 5 01/01/2020 02:00 63408 65400
## 6 01/01/2020 02:30 62711 64000

3 Création de dates

3.1 Jeu de données elec_austr

On créé les dates via une séquence :

elec_austr$date <- seq(from=as.Date("1956/01/01"), by="month", length.out=nrow(elec_austr))
head(elec_fr$date)
## [1] "01/01/2020" "01/01/2020" "01/01/2020" "01/01/2020" "01/01/2020"
## [6] "01/01/2020"

3.2 Jeu de données elec_fr

On peut utiliser le package lubridate et ses multiples commandes de conversion :

library(lubridate)
elec_fr$datehm <- dmy_hm(paste(elec_fr$date, elec_fr$hm))
head(elec_fr$datehm)
## [1] "2020-01-01 00:00:00 UTC" "2020-01-01 00:30:00 UTC"
## [3] "2020-01-01 01:00:00 UTC" "2020-01-01 01:30:00 UTC"
## [5] "2020-01-01 02:00:00 UTC" "2020-01-01 02:30:00 UTC"

Il existe des nombreuses fonctions du type dmy_hms, dmy_h, dmy_hm, dmy_hm, mdy_hms, mdy_h, mdy_hm, mdy_hm

4 Création d’objets ts, xts et tsibble

4.1 Objets ts

On peut créer des objets ts (time series) à l’aide de la commande ts en précisant éventuellement les dates (au pas de temps mensuel) et la fréquence (par défaut égale à 1).

Dans R la décomposition saisonnière est réalisée par défaut à l’aide de la commande decompose ; cette commande s’applique sur des objets ts en considérant comme période de la saisonnalité leur fréquence.

Les fréquences classiques sont 1, 4 (données au pas de temps trimestriel) et 12 (données au pas de temps mensuel).

Pour des données trimestrielles, on pourrait par exemple écrire pour des dates débutant au 3e trimestre 1990 :

ts(sample(1:9), start=c(1990, 3), frequency=4)
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1990              2    6
## 1991    1    5    8    3
## 1992    7    4    9

4.1.1 Jeu de données elec_austr

On peut travailler sur une seule série temporelle :

elec_austr_conso_ts <- ts(elec_austr$conso, start=c(1956, 1), frequency=12)

ou plusieurs :

elec_austr_ts <- ts(elec_austr[, c("conso", "tend")], start=c(1956, 1), frequency=12)
colnames(elec_austr_ts) <- c("Consommation électrique australienne", "Consommation électrique australienne lissée")
head(elec_austr_ts, n=20)
##       Consommation électrique australienne
##  [1,]                                 1254
##  [2,]                                 1290
##  [3,]                                 1379
##  [4,]                                 1346
##  [5,]                                 1535
##  [6,]                                 1555
##  [7,]                                 1655
##  [8,]                                 1651
##  [9,]                                 1500
## [10,]                                 1538
## [11,]                                 1486
## [12,]                                 1394
## [13,]                                 1409
## [14,]                                 1387
## [15,]                                 1543
## [16,]                                 1502
## [17,]                                 1693
## [18,]                                 1616
## [19,]                                 1841
## [20,]                                 1787
##       Consommation électrique australienne lissée
##  [1,]                                          NA
##  [2,]                                          NA
##  [3,]                                          NA
##  [4,]                                          NA
##  [5,]                                          NA
##  [6,]                                          NA
##  [7,]                                    1471.708
##  [8,]                                    1482.208
##  [9,]                                    1493.083
## [10,]                                    1506.417
## [11,]                                    1519.500
## [12,]                                    1528.625
## [13,]                                    1538.917
## [14,]                                    1552.333
## [15,]                                    1563.458
## [16,]                                    1573.542
## [17,]                                    1582.333
## [18,]                                    1590.917
## [19,]                                    1599.000
## [20,]                                    1605.833

On peut obtenir la fréquence :

frequency(elec_austr_conso_ts)
## [1] 12
frequency(elec_austr_ts)
## [1] 12

On peut sélectionner des instants de la série temporelle :

window(elec_austr_conso_ts, start=c(1980, 3), end=c(1981, 9))
##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 1980              7824  7524  8279  8707  9486  8973  8231  8206  7927  7999
## 1981  7834  7521  8284  7999  8940  9381 10078  9796  8471
window(elec_austr_ts, start=c(1980, 3), end=c(1981, 9))
##          Consommation électrique australienne
## Mar 1980                                 7824
## Apr 1980                                 7524
## May 1980                                 8279
## Jun 1980                                 8707
## Jul 1980                                 9486
## Aug 1980                                 8973
## Sep 1980                                 8231
## Oct 1980                                 8206
## Nov 1980                                 7927
## Dec 1980                                 7999
## Jan 1981                                 7834
## Feb 1981                                 7521
## Mar 1981                                 8284
## Apr 1981                                 7999
## May 1981                                 8940
## Jun 1981                                 9381
## Jul 1981                                10078
## Aug 1981                                 9796
## Sep 1981                                 8471
##          Consommation électrique australienne lissée
## Mar 1980                                    8041.958
## Apr 1980                                    8062.792
## May 1980                                    8092.458
## Jun 1980                                    8135.583
## Jul 1980                                    8180.833
## Aug 1980                                    8204.792
## Sep 1980                                    8228.417
## Oct 1980                                    8267.375
## Nov 1980                                    8314.708
## Dec 1980                                    8370.333
## Jan 1981                                    8423.083
## Feb 1981                                    8482.042
## Mar 1981                                    8526.333
## Apr 1981                                    8551.583
## May 1981                                    8576.125
## Jun 1981                                    8592.458
## Jul 1981                                    8613.333
## Aug 1981                                    8643.083
## Sep 1981                                    8672.417

On peut extraire les dates de la série temporelle à l’aide de la commande as.Date du package zoo (pas la commande as.Date du package base) :

library(zoo)
dates_don_ts <- zoo::as.Date(elec_austr_conso_ts)
head(dates_don_ts)
## [1] "1956-01-01" "1956-02-01" "1956-03-01" "1956-04-01" "1956-05-01"
## [6] "1956-06-01"

4.1.2 Jeu de données elec_fr

On peut travailler sur une seule série temporelle :

elec_fr_conso_ts <- ts(elec_fr$conso)

ou plusieurs :

elec_fr_ts <- ts(elec_fr[, c("conso", "prev")])
colnames(elec_fr_ts) <- c("Consommation électrique française", "Consommation électrique française prévue")
head(elec_fr_ts)
##      Consommation électrique française Consommation électrique française prévue
## [1,]                             67068                                    68000
## [2,]                             66103                                    66600
## [3,]                             63943                                    64900
## [4,]                             63904                                    65500
## [5,]                             63408                                    65400
## [6,]                             62711                                    64000

On ne peut considérer ici que les dates et fréquence par défaut : le numéro de l’observation pour les instants et 1 pour la fréquence.

On peut vérifier la fréquence :

frequency(elec_fr_conso_ts)
## [1] 1
frequency(elec_fr_ts)
## [1] 1

4.2 Objets xts

On peut également utiliser le package xts (extended time series) pour gérer les séries temporelles. Ce package a pour ambition d’unifier différentes classes d’objets dont ts et zoo. On peut définir des dates au pas de temps souhaité (même la seconde).

library(xts)

4.2.1 Jeu de données elec_austr

On peut travailler sur une seule série temporelle :

elec_austr_conso_xts <- xts(elec_austr$conso, order.by=elec_austr$date)
elec_austr_conso_xts
##            m.c.seq.row..seq.n...seq.col..drop...FALSE.
## 1956-01-01                                        1254
## 1956-02-01                                        1290
## 1956-03-01                                        1379
## 1956-04-01                                        1346
## 1956-05-01                                        1535
## 1956-06-01                                        1555
## 1956-07-01                                        1655
## 1956-08-01                                        1651
## 1956-09-01                                        1500
## 1956-10-01                                        1538
##        ...                                            
## 1994-11-01                                       13243
## 1994-12-01                                       13590
## 1995-01-01                                       13487
## 1995-02-01                                       12776
## 1995-03-01                                       13812
## 1995-04-01                                       13032
## 1995-05-01                                       14268
## 1995-06-01                                       14473
## 1995-07-01                                       15359
## 1995-08-01                                       14457

ou plusieurs :

elec_austr_xts <- xts(elec_austr[, c("conso", "tend")], order.by=elec_austr$date)
colnames(elec_austr_xts) <- c("Consommation électrique australienne", "Consommation électrique australienne lissée")

On peut sélectionner des instants de la série temporelle :

elec_austr_conso_xts["1990"]
##             [,1]
## 1990-01-01 12336
## 1990-02-01 11793
## 1990-03-01 12877
## 1990-04-01 11923
## 1990-05-01 13306
## 1990-06-01 13988
## 1990-07-01 14002
## 1990-08-01 14336
## 1990-09-01 12867
## 1990-10-01 12721
## 1990-11-01 12449
## 1990-12-01 12686
elec_austr_xts["1990"]
##            Consommation électrique australienne
## 1990-01-01                                12336
## 1990-02-01                                11793
## 1990-03-01                                12877
## 1990-04-01                                11923
## 1990-05-01                                13306
## 1990-06-01                                13988
## 1990-07-01                                14002
## 1990-08-01                                14336
## 1990-09-01                                12867
## 1990-10-01                                12721
## 1990-11-01                                12449
## 1990-12-01                                12686
##            Consommation électrique australienne lissée
## 1990-01-01                                    12748.62
## 1990-02-01                                    12771.71
## 1990-03-01                                    12812.42
## 1990-04-01                                    12839.71
## 1990-05-01                                    12864.12
## 1990-06-01                                    12910.79
## 1990-07-01                                    12960.08
## 1990-08-01                                    12989.08
## 1990-09-01                                    12998.79
## 1990-10-01                                    13020.42
## 1990-11-01                                    13049.62
## 1990-12-01                                    13017.08
elec_austr_conso_xts["1990-8"]
##             [,1]
## 1990-08-01 14336
elec_austr_xts["1990-8"]
##            Consommation électrique australienne
## 1990-08-01                                14336
##            Consommation électrique australienne lissée
## 1990-08-01                                    12989.08
elec_austr_conso_xts["1980-3/1981-9"]
##             [,1]
## 1980-03-01  7824
## 1980-04-01  7524
## 1980-05-01  8279
## 1980-06-01  8707
## 1980-07-01  9486
## 1980-08-01  8973
## 1980-09-01  8231
## 1980-10-01  8206
## 1980-11-01  7927
## 1980-12-01  7999
## 1981-01-01  7834
## 1981-02-01  7521
## 1981-03-01  8284
## 1981-04-01  7999
## 1981-05-01  8940
## 1981-06-01  9381
## 1981-07-01 10078
## 1981-08-01  9796
## 1981-09-01  8471
elec_austr_xts["1980-3/1981-9"]
##            Consommation électrique australienne
## 1980-03-01                                 7824
## 1980-04-01                                 7524
## 1980-05-01                                 8279
## 1980-06-01                                 8707
## 1980-07-01                                 9486
## 1980-08-01                                 8973
## 1980-09-01                                 8231
## 1980-10-01                                 8206
## 1980-11-01                                 7927
## 1980-12-01                                 7999
## 1981-01-01                                 7834
## 1981-02-01                                 7521
## 1981-03-01                                 8284
## 1981-04-01                                 7999
## 1981-05-01                                 8940
## 1981-06-01                                 9381
## 1981-07-01                                10078
## 1981-08-01                                 9796
## 1981-09-01                                 8471
##            Consommation électrique australienne lissée
## 1980-03-01                                    8041.958
## 1980-04-01                                    8062.792
## 1980-05-01                                    8092.458
## 1980-06-01                                    8135.583
## 1980-07-01                                    8180.833
## 1980-08-01                                    8204.792
## 1980-09-01                                    8228.417
## 1980-10-01                                    8267.375
## 1980-11-01                                    8314.708
## 1980-12-01                                    8370.333
## 1981-01-01                                    8423.083
## 1981-02-01                                    8482.042
## 1981-03-01                                    8526.333
## 1981-04-01                                    8551.583
## 1981-05-01                                    8576.125
## 1981-06-01                                    8592.458
## 1981-07-01                                    8613.333
## 1981-08-01                                    8643.083
## 1981-09-01                                    8672.417

On peut extraire les dates de la série temporelle :

dates_elec_austr_conso_xts <- index(elec_austr_conso_xts)
head(dates_elec_austr_conso_xts)
## [1] "1956-01-01" "1956-02-01" "1956-03-01" "1956-04-01" "1956-05-01"
## [6] "1956-06-01"

4.2.2 Jeu de données elec_fr

On peut travailler sur une seule série temporelle :

elec_fr_conso_xts <- xts(elec_fr$conso, order.by=elec_fr$datehm)
head(elec_fr_conso_xts)
## Warning: object timezone ('UTC') is different from system timezone ('')
##   NOTE: set 'options(xts_check_TZ = FALSE)' to disable this warning
##     This note is displayed once per session
##                      [,1]
## 2020-01-01 00:00:00 67068
## 2020-01-01 00:30:00 66103
## 2020-01-01 01:00:00 63943
## 2020-01-01 01:30:00 63904
## 2020-01-01 02:00:00 63408
## 2020-01-01 02:30:00 62711

ou plusieurs :

elec_fr_xts <- xts(elec_fr[, c("conso", "prev")], order.by=elec_fr$datehm)
head(elec_fr_xts)
## Warning: object timezone ('UTC') is different from system timezone ('')
##                     conso  prev
## 2020-01-01 00:00:00 67068 68000
## 2020-01-01 00:30:00 66103 66600
## 2020-01-01 01:00:00 63943 64900
## 2020-01-01 01:30:00 63904 65500
## 2020-01-01 02:00:00 63408 65400
## 2020-01-01 02:30:00 62711 64000
colnames(elec_fr_xts) <- c("Consommation électrique française", "Consommation électrique française prévue")
head(elec_fr_xts)
## Warning: object timezone ('UTC') is different from system timezone ('')
##                     Consommation électrique française
## 2020-01-01 00:00:00                             67068
## 2020-01-01 00:30:00                             66103
## 2020-01-01 01:00:00                             63943
## 2020-01-01 01:30:00                             63904
## 2020-01-01 02:00:00                             63408
## 2020-01-01 02:30:00                             62711
##                     Consommation électrique française prévue
## 2020-01-01 00:00:00                                    68000
## 2020-01-01 00:30:00                                    66600
## 2020-01-01 01:00:00                                    64900
## 2020-01-01 01:30:00                                    65500
## 2020-01-01 02:00:00                                    65400
## 2020-01-01 02:30:00                                    64000
elec_fr_xts <- xts(elec_fr$conso, order.by=elec_fr$datehm)

On peut sélectionner des instants de la série temporelle :

elec_fr_xts["2020-01-21 18:00:00"]
## Warning: object timezone ('UTC') is different from system timezone ('')
##                      [,1]
## 2020-01-21 18:00:00 77507

On peut extraire les dates de la série temporelle :

dates_elec_fr_conso_xts <- index(elec_fr_conso_xts)
head(dates_elec_fr_conso_xts)
## [1] "2020-01-01 00:00:00 UTC" "2020-01-01 00:30:00 UTC"
## [3] "2020-01-01 01:00:00 UTC" "2020-01-01 01:30:00 UTC"
## [5] "2020-01-01 02:00:00 UTC" "2020-01-01 02:30:00 UTC"

4.3 Objets tsibble

On peut également utiliser le package tsibble pour gérer les séries temporelles, ce package étend la notion de tibble aux séries temporelles.

library(tsibble)

4.3.1 Jeu de données elec_austr

On peut travailler sur une seule série temporelle :

elec_austr_conso_tsibble <- tsibble(date=elec_austr$date, 
                                    conso=elec_austr$conso, 
                                    index=date)
head(elec_austr_conso_tsibble)
## # A tsibble: 6 x 2 [1D]
##   date       conso
##   <date>     <int>
## 1 1956-01-01  1254
## 2 1956-02-01  1290
## 3 1956-03-01  1379
## 4 1956-04-01  1346
## 5 1956-05-01  1535
## 6 1956-06-01  1555

ou plusieurs :

elec_austr_conso_tsibble <- tsibble(date=elec_austr$date, 
                                    conso=elec_austr$conso, 
                                    tend=elec_austr$tend, 
                                    index=date)
head(elec_austr_conso_tsibble, n=10)
## # A tsibble: 10 x 3 [1D]
##    date       conso  tend
##    <date>     <int> <dbl>
##  1 1956-01-01  1254   NA 
##  2 1956-02-01  1290   NA 
##  3 1956-03-01  1379   NA 
##  4 1956-04-01  1346   NA 
##  5 1956-05-01  1535   NA 
##  6 1956-06-01  1555   NA 
##  7 1956-07-01  1655 1472.
##  8 1956-08-01  1651 1482.
##  9 1956-09-01  1500 1493.
## 10 1956-10-01  1538 1506.

4.3.2 Jeu de données elec_austr

On peut travailler sur une seule série temporelle :

elec_fr_tsibble <- tsibble(datehm=elec_fr$datehm, 
                           conso=elec_fr$conso, 
                           index=datehm)
head(elec_fr_tsibble)
## # A tsibble: 6 x 2 [30m] <UTC>
##   datehm              conso
##   <dttm>              <int>
## 1 2020-01-01 00:00:00 67068
## 2 2020-01-01 00:30:00 66103
## 3 2020-01-01 01:00:00 63943
## 4 2020-01-01 01:30:00 63904
## 5 2020-01-01 02:00:00 63408
## 6 2020-01-01 02:30:00 62711

ou plusieurs :

elec_fr_tsibble <- tsibble(datehm=elec_fr$datehm, 
                           conso=elec_fr$conso, 
                           prev=elec_fr$prev, 
                           index=datehm)
head(elec_fr_tsibble)
## # A tsibble: 6 x 3 [30m] <UTC>
##   datehm              conso  prev
##   <dttm>              <int> <int>
## 1 2020-01-01 00:00:00 67068 68000
## 2 2020-01-01 00:30:00 66103 66600
## 3 2020-01-01 01:00:00 63943 64900
## 4 2020-01-01 01:30:00 63904 65500
## 5 2020-01-01 02:00:00 63408 65400
## 6 2020-01-01 02:30:00 62711 64000

5 Manipulations de dates à l’aide du package lubridate

library("lubridate")

5.1 Jeu de données elec_austr

head(elec_austr$date, n=20)
##  [1] "1956-01-01" "1956-02-01" "1956-03-01" "1956-04-01" "1956-05-01"
##  [6] "1956-06-01" "1956-07-01" "1956-08-01" "1956-09-01" "1956-10-01"
## [11] "1956-11-01" "1956-12-01" "1957-01-01" "1957-02-01" "1957-03-01"
## [16] "1957-04-01" "1957-05-01" "1957-06-01" "1957-07-01" "1957-08-01"
an <- year(elec_austr$date)
head(an, n=20)
##  [1] 1956 1956 1956 1956 1956 1956 1956 1956 1956 1956 1956 1956 1957 1957 1957
## [16] 1957 1957 1957 1957 1957
mois <- months(elec_austr$date) # Commande de base dans R (au pluriel)
head(mois, n=60)
##  [1] "January"   "February"  "March"     "April"     "May"       "June"     
##  [7] "July"      "August"    "September" "October"   "November"  "December" 
## [13] "January"   "February"  "March"     "April"     "May"       "June"     
## [19] "July"      "August"    "September" "October"   "November"  "December" 
## [25] "January"   "February"  "March"     "April"     "May"       "June"     
## [31] "July"      "August"    "September" "October"   "November"  "December" 
## [37] "January"   "February"  "March"     "April"     "May"       "June"     
## [43] "July"      "August"    "September" "October"   "November"  "December" 
## [49] "January"   "February"  "March"     "April"     "May"       "June"     
## [55] "July"      "August"    "September" "October"   "November"  "December"
mois <- month(elec_austr$date) # Commande (au singulier) du package `lubridate`
head(mois, n=60)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12  1
## [26]  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12  1  2
## [51]  3  4  5  6  7  8  9 10 11 12
jour_an <- yday(elec_austr$date)
head(jour_an, n=20)
##  [1]   1  32  61  92 122 153 183 214 245 275 306 336   1  32  60  91 121 152 182
## [20] 213
jour_mois <- mday(elec_austr$date)
head(jour_mois, n=20)
##  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
jour_semaine <- wday(elec_austr$date, 
                     label=FALSE, 
                     week_start=1)
head(jour_semaine, n=20)
##  [1] 7 3 4 7 2 5 7 3 6 1 4 6 2 5 5 1 3 6 1 4

Dans la convention anglo-saxonne, 1 correspond au dimanche. L’option week_start=1 fait débuter la semaine au lundi.

jour_semaine <- wday(elec_austr$date, 
                     week_start=1, 
                     label=TRUE)
head(jour_semaine, n=20)
##  [1] Sun Wed Thu Sun Tue Fri Sun Wed Sat Mon Thu Sat Tue Fri Fri Mon Wed Sat Mon
## [20] Thu
## Levels: Mon < Tue < Wed < Thu < Fri < Sat < Sun

On peut “arrondir” les dates à l’aide des commande round_date, florr_date et ceiling_date :

head(floor_date(elec_austr$date, unit="year"), n=20)
##  [1] "1956-01-01" "1956-01-01" "1956-01-01" "1956-01-01" "1956-01-01"
##  [6] "1956-01-01" "1956-01-01" "1956-01-01" "1956-01-01" "1956-01-01"
## [11] "1956-01-01" "1956-01-01" "1957-01-01" "1957-01-01" "1957-01-01"
## [16] "1957-01-01" "1957-01-01" "1957-01-01" "1957-01-01" "1957-01-01"

5.2 Jeu de données elec_fr

date <- date(elec_fr$datehm)
head(date, n=20)
##  [1] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
##  [6] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
## [11] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"
## [16] "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01" "2020-01-01"

On peut alors travailler sur les dates comme vu avec le jeu de données elec_austr.

heure <- hour(elec_fr$datehm)
head(heure)
## [1] 0 0 1 1 2 2
minut <- minute(elec_fr$datehm)
head(minut)
## [1]  0 30  0 30  0 30

On peut “arrondir” les dates à l’aide des commande round_date, floor_date et ceiling_date :

head(floor_date(elec_fr$datehm, unit="hour"), n=40)
##  [1] "2020-01-01 00:00:00 UTC" "2020-01-01 00:00:00 UTC"
##  [3] "2020-01-01 01:00:00 UTC" "2020-01-01 01:00:00 UTC"
##  [5] "2020-01-01 02:00:00 UTC" "2020-01-01 02:00:00 UTC"
##  [7] "2020-01-01 03:00:00 UTC" "2020-01-01 03:00:00 UTC"
##  [9] "2020-01-01 04:00:00 UTC" "2020-01-01 04:00:00 UTC"
## [11] "2020-01-01 05:00:00 UTC" "2020-01-01 05:00:00 UTC"
## [13] "2020-01-01 06:00:00 UTC" "2020-01-01 06:00:00 UTC"
## [15] "2020-01-01 07:00:00 UTC" "2020-01-01 07:00:00 UTC"
## [17] "2020-01-01 08:00:00 UTC" "2020-01-01 08:00:00 UTC"
## [19] "2020-01-01 09:00:00 UTC" "2020-01-01 09:00:00 UTC"
## [21] "2020-01-01 10:00:00 UTC" "2020-01-01 10:00:00 UTC"
## [23] "2020-01-01 11:00:00 UTC" "2020-01-01 11:00:00 UTC"
## [25] "2020-01-01 12:00:00 UTC" "2020-01-01 12:00:00 UTC"
## [27] "2020-01-01 13:00:00 UTC" "2020-01-01 13:00:00 UTC"
## [29] "2020-01-01 14:00:00 UTC" "2020-01-01 14:00:00 UTC"
## [31] "2020-01-01 15:00:00 UTC" "2020-01-01 15:00:00 UTC"
## [33] "2020-01-01 16:00:00 UTC" "2020-01-01 16:00:00 UTC"
## [35] "2020-01-01 17:00:00 UTC" "2020-01-01 17:00:00 UTC"
## [37] "2020-01-01 18:00:00 UTC" "2020-01-01 18:00:00 UTC"
## [39] "2020-01-01 19:00:00 UTC" "2020-01-01 19:00:00 UTC"
head(floor_date(elec_fr$datehm, unit="day"), n=40)
##  [1] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
##  [5] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
##  [9] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [13] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [17] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [21] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [25] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [29] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [33] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [37] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
head(floor_date(elec_fr$datehm, unit="month"), n=40)
##  [1] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
##  [5] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
##  [9] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [13] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [17] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [21] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [25] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [29] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [33] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [37] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
head(floor_date(elec_fr$datehm, unit="year"), n=40)
##  [1] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
##  [5] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
##  [9] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [13] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [17] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [21] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [25] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [29] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [33] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"
## [37] "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC" "2020-01-01 UTC"

6 Quelques graphiques

6.1 Avec plot

6.1.1 Jeu de données elec_austr

plot(1:nrow(elec_austr), elec_austr$conso, type="l", col="red", xlab="", ylab="Consommation électrique australienne")

plot(elec_austr$conso, type="l", col="red", xlab="", ylab="Consommation électrique australienne")

6.1.2 Jeu de données elec_fr

plot(1:nrow(elec_fr), elec_fr$conso, type="l", col="red", xlab="", ylab="Consommation électrique française")

6.2 Avec ggplot

library(ggplot2)

6.2.1 Jeu de données elec_austr

ggplot()+
  geom_line(data=elec_austr, aes(x=date, y=conso))+
  labs(x="", y="Consommation électrique australienne")

ggplot()+
  geom_line(data=elec_austr, aes(x=date, y=conso, colour="Consommation électrique australienne"))+
  geom_line(data=elec_austr, aes(x=date, y=tend, colour="Consommation électrique australienne lissée"))+
  labs(x="", y="", colour="")
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).

6.2.2 Jeu de données elec_fr

ggplot()+
  geom_line(data=elec_fr, aes(x=datehm, y=conso))+
  labs(x="", y="Consommation électrique française")

ggplot()+
  geom_line(data=elec_fr, aes(x=datehm, y=conso, colour="Consommation électrique française"))+
  geom_line(data=elec_fr, aes(x=datehm, y=prev, colour="Consommation électrique française prévue"))+
  labs(x="", y="", colour="")

6.3 Avec autoplot

library(forecast)

6.3.1 Jeu de données elec_austr

autoplot(elec_austr_conso_ts, xlab="", ylab="Consommation électrique australienne")

autoplot(elec_austr_ts, xlab="", ylab="")

6.3.2 Jeu de données elec_fr

autoplot(elec_fr_conso_ts, xlab="", ylab="Consommation électrique française")

autoplot(elec_fr_ts, xlab="", ylab="")

6.4 Avec plot.ts ou ts.plot

On peut utiliser les commandes plot.ts et ts.plot sur des objets qui ne sont pas au format ts, mais aucune date n’est alors gérée. Evidemment, on peut utiliser la commande plot.ts sur des objets ts (on peut simplement écrire plot pour des objets ts).

On peut facilement superposer plusieurs séries temporelles au format ts ayant la même fréquence à l’aide de la commande ts.plot

La commande ts.plot permet de tracer non seulement des graphiques identiques à ceux obtenus par la commande plot.ts mais également de superposer plusieurs séries temporelles au format ts ayant la même fréquence.

6.4.1 Jeu de données elec_austr

plot.ts(elec_austr$conso, xlab="", ylab="Consommation électrique australienne")
ts.plot(elec_austr$conso, xlab="", ylab="Consommation électrique australienne")

elec_austr_tend_ts <- ts(elec_austr$tend, start=c(1956, 1), frequency=12)

ts.plot(elec_austr_ts, elec_austr_tend_ts, xlab="", col=c(1, 2))
legend("topleft", col=c(1, 2), lwd=c(1, 1), legend=c("Consommation électrique australienne", "Consommation électrique australienne lissée"))

6.4.2 Jeu de données elec_fr

elec_fr_prev_ts <- ts(elec_fr$prev)

ts.plot(elec_fr_ts, elec_fr_prev_ts, xlab="", col=c(1, 2))
legend("topleft", col=c(1, 2), lwd=c(1, 1), legend=c("Consommation électrique française", "Consommation électrique française prévue"))

6.5 Avec plot.xts :

On peut utiliser la commande plot.xts du package xts sur des objets xts (ou le raccourci plot).

6.5.1 Jeu de données elec_austr

plot.xts(elec_austr_conso_xts, main="Consommation électrique australienne")
plot(elec_austr_conso_xts, main="Consommation électrique australienne")

plot.xts(elec_austr_xts, main="Consommation électrique australienne (lissée ou non)")
plot(elec_austr_xts, main="Consommation électrique australienne (lissée ou non)")

6.5.2 Jeu de données elec_fr

plot.xts(elec_fr_conso_xts, main="Consommation électrique française")

plot(elec_fr_xts, main="Consommation électrique française (réalisée et prévue)")

6.6 Avec dygraph

On peut utiliser la commande dygraph du package dygraphs sur des objets ts ou xts :

library(dygraphs)

On peut facilement zoomer à l’aide d’une sélection via la souris, et dezoomer en double cliquant sur le graphique). Lors du passage de la souris (sans clic) sur le graphique, date et valeur sont affichées.

On peut également ajouter une barre de défilement (on peut jouer sur les curseurs).

6.6.1 Jeu de données elec_austr

dygraph(elec_austr_conso_ts) %>%
  dySeries("V1", label="Consommation électrique australienne") %>%
  dyRangeSelector()
dygraph(elec_austr_xts) %>%
  dyRangeSelector()

6.6.2 Jeu de données elec_fr

dygraph(elec_fr_conso_xts) %>%
  dySeries("V1", label="Consommation électrique française") %>%
  dyRangeSelector()
dygraph(elec_fr_xts)

6.7 Complément : insertion d’équations LaTeX dans les titres

library(latex2exp)

On insère le code LaTeX à l’aide de la commande TeX, par exemple :

ts.plot(elec_austr_conso_ts, elec_austr_tend_ts, col=c(1, 2))
legend("topleft", col=c(1, 2), lwd=c(1, 1), legend=c(TeX("$X_t$"), TeX("$M_{(2\\times)12}\\, X_t$")))

7 En vue de la décomposition saisonnière (sur le jeu de données elec_austr)

7.1 Avec xyplot

library(lattice)
df <- data.frame(conso=elec_austr$conso, 
                 mois=month(elec_austr$date), 
                 an=year(elec_austr$date))

xyplot(conso~mois, 
       data=df, 
       group=an, 
       type="l", 
       xlab="Mois", 
       ylab="Consommation électrique australienne", 
       auto.key=list(space="bottom", title="Années", columns=5, just=0.1))

7.2 Avec monthplot

monthplot(elec_austr_conso_ts, ylab="Consommation électrique australienne")

7.3 Avec ggseasonplot

library(forecast)
ggseasonplot(elec_austr_conso_ts, 
             xlab="Mois", 
             ylab="Consommation électrique australienne", 
             main="Graphique saisonnier")

7.4 Calcul de statistiques pour arbitrer entre modèles additif et multiplicatif

On calcule les minima et maxima annuels :

min_an <- by(data=elec_austr$conso, INDICES=year(elec_austr$date), FUN=min)
head(min_an)
## year(elec_austr$date)
## 1956 1957 1958 1959 1960 1961 
## 1254 1387 1463 1577 1721 1839
max_an <- by(data=elec_austr$conso, INDICES=year(elec_austr$date), FUN=max)
head(max_an)
## year(elec_austr$date)
## 1956 1957 1958 1959 1960 1961 
## 1655 1841 1994 2105 2287 2382
df <- data.frame(x=min(year(elec_austr$date)):max(year(elec_austr$date)), 
                 y=as.numeric(max_an-min_an))

ggplot()+
  geom_bar(data=df, aes(x=x, y=y), stat="identity", fill="steelblue", width=0.5)+
  labs(x="Année", y="Amplitude", title="Où l'on voit des amplitudes croissantes")